iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 18
1
Cloud Native

從零開始建立自動化發佈的流水線系列 第 18

18. CI 訊息通知 - Line(下)

  • 分享至 

  • xImage
  •  

Eric: 不管是 Azure DevOps、Travis CI 還是 Jenkins ,這些 CI Server 經由 webhooks 回傳的資訊,ITFFF 都無法直接去識別。所以要實作一個 webapi 來做為中繼轉換。

吉米: 所以要再次利用 Azure ,來建立 web api 嗎?

Eric: 沒錯,讓我們開始動作吧!


01. Web Api

建立一個 web API 的專案,筆者在這邊是選擇使用 Asp.Net Core Web 應用程式API

vs_create_project

vs_create_web

因為 IFTTT 接收的格式,只支援 value1、value2、value3 這個欄位名,所以建立一個 IFTTTModel 的類別。

public class IFTTTModel
{
    string value1 {set;get;}
    string value2 {set;get;}
    string value3 {set;get;}
}

接著,進行轉發的實作。實作中,使用 nuget 套件 Restsharp 進行 Post 訊息到 IFTTT。

記得將 RestClinet(...) 內的 ... 指定到 IFTTT 的 webhook url。

public void Post([FromBody] string value)
{
    RestClient client = new RestClient("https://maker.ifttt.com/trigger/CI_Build_result/with/key/den2SL6fXRgg4MJUsAj27w");
    RestRequest request = new RestRequest(Method.POST);
    request.AddHeader("Content-Type", "application/json");

    ITFFFModel model = new ITFFFModel {value1 = "VS", value2 = "Ean", value3 = value};
   var json = JsonConvert.SerializeObject(model);
   request.AddParameter("Image", json, ParameterType.RequestBody);

   var response = client.Execute(request);
}

要注意的是,上面的程式,只是基本框架,還不能滿足我們的需求。使用 PostMan 進行測試,會看到下面的訊息。

line1

02. Azure App service

接著,將剛剛完成的 web api 發佈到 Azure App Service 。在建立發佈的設定時,選擇 Azure App Service。

publish

publish_azure_setting

publish_finish

因為是第一次建立,筆者選擇使用預設值。完成建立後,可以看到網站 URL 這個資料,這等等會用到。

03. Travis CI

針對 Travis CI 的部份,我們在 Web API 中,加入一個 travis 的 Controller。並把上面 程式碼復制到 travisController 之中。

[Route("api/[controller]")]
public class travisController : Controller
{
    [HttpPost]
    public void Post([FromBody] string value)
    {
        RestClient client = new RestClient("https://maker.ifttt.com/trigger/CI_Build_result/with/key/den2SL6fXRgg4MJUsAj27w");
        RestRequest request = new RestRequest(Method.POST);
        request.AddHeader("Content-Type", "application/json");

        ITFFFModel model = new ITFFFModel {value1 = "VS", value2 = "Ean", value3 = value};
        var json = JsonConvert.SerializeObject(model);
        request.AddParameter("Image", json, ParameterType.RequestBody);
        var response = client.Execute(request);
    }
}    

在發佈程式到 Azure 後,接著,我們到 Github repository,將 .travis.yml 中 webhooks 的 url 改為 {網站URL}/api/travis 即可。

webhooks:
    urls:
      - https://cirelay20181102082324.azurewebsites.net/api/travis
      
    on_success: change # default: always
    on_failure: always # default: always
    on_start: change   # default: never
    on_cancel: always # default: always
    on_error: always # default: always

接著,要針對 Travis CI 傳過來資料進行解析,並將資料放入 IFTTTModel 之中,才能正確的傳送資料到 Line 之中。

04. Azure DevOps

針對 Travis CI 的部份,我們在 Web API 中,加入一個 AzurePipeline 的 Controller。程式的寫法,請參考 Travis 的部份。

接著到 Azure DevOps 的 project settings \ Service hooks 中,將 Web Hooks 中,URL 位置的內容,變成為 {網站URL}/api/travis 即可。

azure_devops_action

按下 Test 後,Line Notify 就會收到訊息了。但這時傳送的訊息也無法滿足我們的需求,所以要在 AzurePipeline 的 Post 內,進行資訊解析。才能正確傳送所需的訊息到 Line 。


吉米: Line 的串接動作,跟 E-mail 相比,增加了不少的設定與動作。

Eric: 對啊,除了 Line 之後,接下來,我們來串接 Microsoft Teams 這個溝通平台吧。

吉米: 嗯嗯。

<<待續>>

延伸閱讀

  1. 在 Azure 中建立 ASP.NET Core Web 應用程式

上一篇
17. CI 訊息通知 - Line(中)
下一篇
19. CI 訊息通知 - Microsoft Teams
系列文
從零開始建立自動化發佈的流水線30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言